/**
 * https://leetcode-cn.com/problems/roman-to-integer/
 * 罗马数字转为整数
 * @param s 
 */
const romanToInt = (s: string): number => {
    // 特殊 I(V, X)  X(L, C)  C(D, M)
    const map: Record<string, number> = {
        I: 1,
        V: 5,
        X: 10,
        L: 50,
        C: 100,
        D: 500,
        M: 1000,
    }

    // 整数和 
    let ans = 0,
        p = 0,
        len = s.length

    // 从左往后遍历
    while (p < len) {
        // 下一个默认为0
        let n = map[s[p + 1]]
        n = n == undefined ? 0 : map[s[p + 1]]

        // 下一个大于当前
        if (n > map[s[p]]) {
            // 右边的大于左边
            ans += ((-map[s[p]]) + n)
            p++; // 跳过下一个
        } else {
            ans += map[s[p]]
        }
        p++
    }
    return ans;
};

const romanToInt2 = (s: string): number => {

    let p = 0,
        len = s.length,
        ans = 0

    // 遍历字符串
    while (p < len) {
        switch (s[p]) {
            case 'I':
                if (s[p + 1] !== 'V' && s[p + 1] !== 'X') {
                    // 不等于特殊特殊情况
                    ans += 1;
                } else if (s[p + 1] === 'V') {
                    // IV
                    ans += 4;
                    p++
                } else if (s[p + 1] === 'X') {
                    // IX
                    ans += 9
                    p++
                }
                break;
            case 'V':
                ans += 5
                break;
            case 'X':
                if (s[p + 1] !== 'L' && s[p + 1] !== 'C') {
                    // 不等于特殊特殊情况
                    ans += 10;
                } else if (s[p + 1] === 'L') {
                    // XL
                    ans += 40;
                    p++
                } else if (s[p + 1] === 'C') {
                    // XC
                    ans += 90
                    p++
                }
                break;
            case 'L':
                ans += 50
                break;
            case 'C':
                if (s[p + 1] !== 'D' && s[p + 1] !== 'M') {
                    // 不等于特殊特殊情况
                    ans += 100;
                } else if (s[p + 1] === 'D') {
                    // CD
                    ans += 400;
                    p++
                } else if (s[p + 1] === 'M') {
                    // CM
                    ans += 900
                    p++
                }
                break;
            case 'D':
                ans += 500
                break;
            case 'M':
                ans += 1000
        }
        p++;
    }
    return ans
};